﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using Persons.Interfaces;
using System.IO;
using System.Text.RegularExpressions;

namespace Persons.Classes
{
    /// <summary>
    /// Класс, реализующий персону
    /// </summary>
    public class Persona : IComparable<Persona>
    {
        int id;
        string fname;
        string lname;
        int age;
        byte[] image;
        string filename;
        

        /// <summary>
        /// Поле "ID" 
        /// </summary>
        public int ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        /// <summary>
        /// Поле "Имя"
        /// </summary>
        public string Fname
        {
            get
            {
                return fname;
            }
            set
            {
                fname = value;
            }
        }
        /// <summary>
        /// Поле "Фамилия"
        /// </summary>
        public string Lname
        {
            get
            {
                return lname;
            }
            set
            {
                lname = value;
            }
        }
        /// <summary>
        /// Поле "Возраст"
        /// </summary>
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
        /// <summary>
        /// Поле "Фото"
        /// </summary>
        public byte[] Photo
        {
            get
            {
                return image ;
            }
            set
            {
                image  = value;
            }
        }
        /// <summary>
        /// Поле "Имя файла"
        /// </summary>
        public string FileName
        {
            get
            {
                return filename;
            }
            set
            {
                filename = value;
            }
        }
        /// <summary>
        /// Пустой конструктор персоны
        /// </summary>
        public Persona() { }
        /// <summary>
        /// Конструктор персоны
        /// </summary>
        /// <param name="_id">ID персоны</param>
        /// <param name="_fname">Имя персоны</param>
        /// <param name="_lname">Фамилия персоны</param>
        /// <param name="_age">Возраст персоны</param>
        public Persona(int _id, string _fname, string _lname, int _age, byte[] _photo)
        {
            ID = _id;
            Fname = _fname;
            Lname = _lname;
            Age = _age;
            Photo = _photo;
        }
        /// <summary>
        /// Метод сравнения текущей персоны с другой персоной
        /// </summary>
        /// <param name="other">Другая персона</param>
        /// <returns>Меньше нуля - Данный экземпляр в порядке сортировки следует перед other. Нуль - Данный экземпляр имеет ту же позицию в порядке сортировки, что и объект other. Больше нуля - Данный экземпляр в порядке сортировки следует после other. </returns>
        public int CompareTo(Persona other)
        {
            return ID.CompareTo(other.ID);
        }

        //------------------------------------------------------------
        //CSV
        //
        /// <summary>
        /// Метод преобразует указанную персону в строку формата CSV
        /// </summary>
        /// <param name="per">Персона для преобразования</param>
        /// <returns>Строку формата CSV</returns>
        public string MakeCSVStrFromPersona()
        {
            return string.Format("{0},{1},{2},{3}", this.ID.ToString(), this.Fname, this.Lname, this.Age.ToString());
        }
        /// <summary>
        /// Метод преобразует строку формата CSV в персону
        /// </summary>
        /// <param name="str">Строка формата CSV</param>
        /// <returns>Персону</returns>
        public static Persona GetPersonaFromCSVStr(string str)
        {
            char[] p = { ',' };
            string[] line = str.Split(p);
            return new Persona(Convert.ToInt32(line[0]), line[1], line[2], Convert.ToInt32(line[3]),null);            
        }
        //-------------------------------------------------------------------------
        //XML
        //
        // <summary>
        /// Метод преобразует указанную персону в строку формата XML
        /// </summary>
        /// <param name="per">Персона для преобразования</param>
        /// <returns>Строку формата XML</returns>
        public string MakeXMLStrFromPersona()
        {
            string img = "";
            if (this.Photo != null)
            {
                img = Encoding.Default.GetString(this.Photo);
            }
            return "<Persona><ID>" + this.ID + "</ID><Fname>" + this.Fname + "</Fname><Lname>" + this.Lname + "</Lname><Age>" + this.Age + "</Age><Photo>" + img + "</Photo></Person>";            
        }
        /// <summary>
        /// Метод преобразует строку формата XML в персону
        /// </summary>
        /// <param name="str">Строка формата XML</param>
        /// <returns>Персону</returns>
        public static Persona GetPersonaFromXMLStr(string str)
        {
            Persona p = new Persona();
            p.ID=Convert.ToInt32(Persona.GetValue(str,"ID"));
            p.Fname = Persona.GetValue(str, "Fname");
            p.Lname = Persona.GetValue(str, "Lname");
            p.Age = Convert.ToInt32(Persona.GetValue(str, "Age"));
            p.Photo = Encoding.Default.GetBytes(Persona.GetValue(str, "Photo"));
            //return new Persona(Convert.ToInt32(line[0]), line[1], line[2], Convert.ToInt32(line[3]), null);
            return p;
        }
        public static string GetValue(string str, string field)
        {
            Regex regex = new Regex("<" + field + ">(.+?)</" + field + ">");
            Match match=regex.Match(str);
            return match.Groups[1].Value;
        }
        public static string GetPhoto(string str)
        {
            Regex regex = new Regex(">(.+?)<");
            Match match = regex.Match(str);
            return match.Groups[1].Value;
        }        

        //------------------------------------------------------------
        //DB
        //
        /// <summary>
        /// Метод преобразует указанную персону в строку INSERT для вставки персоны в БД
        /// </summary>
        /// <param name="per">Персона для преобразования</param>
        /// <returns>Строку INSERT</returns>
        public string MakeDBStrFromPersona()
        {
            return "INSERT Persona (ID, Fname, Lname, Age, Photo) Values (" + this.ID + ",\'" + this.Fname + "\'" + ",\'" + this.Lname + "\'" + "," + this.Age + ",  ?" + ")";            
        }
        /// <summary>
        /// Метод преобразует строку формата БД в персону
        /// </summary>
        /// <param name="str">Строка формата БД</param>
        /// <returns>Персону</returns>
        public static Persona GetPersonaFromDB(OleDbDataReader reader)
        {
            Persona p;
            try
            {
                p = new Persona((int)reader["ID"], reader["Fname"].ToString(), reader["Lname"].ToString(), (int)reader["Age"], (byte[])reader["Photo"]);
            }
            catch
            {
                p = new Persona((int)reader["ID"], reader["Fname"].ToString(), reader["Lname"].ToString(), (int)reader["Age"], null);
            }
            return p;

        }
       
    }
}
